package com.zjsru.plan2023.oneday;

/**
 *
 * @author cooklee
 * @date 2023/08/21
 * 移动片段得到字符串
 * \
 * 字符 'L' 和 'R' 表示片段，其中片段 'L' 只有在其左侧直接存在一个 空位 时才能向 左 移动，而片段 'R' 只有在其右侧直接存在一个 空位 时才能向 右 移动。
 * 字符 '_' 表示可以被 任意 'L' 或 'R' 片段占据的空位。
 * 如果在移动字符串 start 中的片段任意次之后可以得到字符串
 * \
 * 输入：start = "_L__R__R_", target = "L______RR"
 * 输出：true
 * 解释：可以从字符串 start 获得 target ，需要进行下面的移动：
 * - 将第一个片段向左移动一步，字符串现在变为 "L___R__R_" 。
 * - 将最后一个片段向右移动一步，字符串现在变为 "L___R___R" 。
 * - 将第二个片段向右移动三步，字符串现在变为 "L______RR" 。
 * 可以从字符串 start 得到 target ，所以返回 true 。
 */
public class CanChange {
    /**
     * 双指针
     *
     * @param start  开始
     * @param target 目标
     * @return boolean
     */
    public boolean canChange(String start, String target) {
        int len = start.length();
        int i = 0, j = 0;
        while (i < len && j < len) {
            while (i < len && start.charAt(i) == '_') {
                i++;
            }
            while (j < len && target.charAt(j) == '_') {
                j++;
            }
            if (i < len && j < len) {
                if (start.charAt(i) != target.charAt(j)) {
                    return false;
                }
                char c = start.charAt(i);
                //LR出现是有顺序的
                if ((c == 'L' && i < j) || (c == 'R' && i > j)) {
                    return false;
                }
                i++;
                j++;
            }
        }
        //如果 i 和 j 中有一个下标大于等于 len，则有一个字符串已经遍历到末尾，
        // 继续遍历另一个字符串中的其余字符，如果其余字符中出现非 ‘_’ 的字符，则该字符不能与任意字符匹配，因为这是LR已经被匹配掉了。
        while (i < len) {
            if (start.charAt(i) != '_') {
                return false;
            }
            i++;
        }
        while (j < len) {
            if (target.charAt(j) != '_') {
                return false;
            }
            j++;
        }
        return true;
    }

    public static void main(String[] args) {
        CanChange canChange = new CanChange();
        String start = "_L__R__R_";
        String target = "L______RR";
        System.out.println(canChange.canChange(start, target));
    }
}
